package com.tql.test_07;

import java.util.concurrent.*;

/*
*  基于ThreadPoolExecutor 去创建线程池
*  线程池面试：
*   三个方法(单一线池，固定线池，缓存线池)
*   七个参数
*
*   四个拒绝策略
*   new ThreadPoolExecutor.AbortPolicy() //不处理，抛出异常
*   new ThreadPoolExecutor.CallerRunsPolicy() // 哪里来的回哪里去
*   new ThreadPoolExecutor.DiscardPolicy() //队列满了，丢弃任务，不会抛出异常
*   new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了，尝试与最早的线程竞争，如果最早的线程执行完，可以运行（不一定抢到）
* */
public class ThreadPoolExcuterTest {
    public static void main(String[] args) {
        //基于Executors工具类创建线程池不安全
        /*ExecutorService executorService = Executors.newFixedThreadPool(5);*/
        //最大线程数为 max+阻塞队列的容量
        //max线程数优化参考：1.跟CPU核数有关(可以设置为CPU核数，获取CPU核数 Runtime.getRuntime().availableProcessors()) 2. 跟IO任务操作  （max线程数 > IO任务线程数）
        ExecutorService threadPoolExecutor = new ThreadPoolExecutor(2,5,3, TimeUnit.SECONDS,new LinkedBlockingQueue<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardOldestPolicy());
        for (int i = 1; i <= 9; i++) {
            //线程创建交给线程池去创建
            threadPoolExecutor.execute(()->{
                System.out.println(Thread.currentThread().getName()+"正在执行");
            });

        }
    }
}
